package com.yulon.androidh5vue;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.JsPromptResult;
import android.webkit.JsResult;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.TextView;

import com.alibaba.fastjson.JSON;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import static java.lang.System.err;
import static java.lang.System.setOut;

public class MainActivity extends AppCompatActivity {
    //https://www.jianshu.com/p/345f4d8a5cfa
    WebView mWebview;
    WebSettings mWebSettings;
    TextView beginLoading,endLoading,loading,mtitle;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWebview = (WebView) findViewById(R.id.webView1);
        beginLoading = (TextView) findViewById(R.id.text_beginLoading);
        endLoading = (TextView) findViewById(R.id.text_endLoading);
        loading = (TextView) findViewById(R.id.text_Loading);
        mtitle = (TextView) findViewById(R.id.title);

        WebSettings webSettings = mWebview.getSettings();

        // 设置与Js交互的权限
        webSettings.setJavaScriptEnabled(true);
        // 设置允许JS弹窗
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);

        mWebview.loadUrl("file:///android_asset/web/html/vueTest.html");

        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 通过Handler发送消息
                mWebview.post(new Runnable() {
                    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
                    @Override
                    public void run() {

                        // 注意调用的JS方法名要对应上
                        // 调用javascript的callJS()方法
                        //方法一：
                        //mWebview.loadUrl("javascript:callJS()");
                        //方法二：
                        //优点：该方法比第一种方法效率更高、使用更简洁。
                        //因为该方法的执行不会使页面刷新，而第一种方法（loadUrl ）的执行则会。
                        //Android 4.4 后才可使用
                        //2.1.3 使用建议:两种方法混合使用，即Android 4.4以下使用方法1，Android 4.4以上方法2
                        List<HashMap<String, String>> list = new ArrayList();
                        HashMap<String, String> row1 = new HashMap<String, String>();
                        row1.put("name","john");

                        HashMap<String, String> row2 = new HashMap<String, String>();
                        row2.put("name","john2");

                        HashMap<String, String> row3 = new HashMap<String, String>();
                        row3.put("name","john33");

                        list.add(row1);
                        list.add(row2);
                        list.add(row3);

                        String json = JSON.toJSONString(list);

                        String str = "vm.msgs="+json;
                        System.out.println(str);
                        System.out.println("==============");


                        mWebview.evaluateJavascript("javascript:vm.callJS('" + json + "')", new ValueCallback<String>() {
                            @Override
                            public void onReceiveValue(String value) {
                                //此处为 js 返回的结果
                                System.out.println("onReceiveValue");
//                                String replace = value.replace("\"", "");//移除双引号
//                                String[] split = replace.split(",");//拆分字符串  根据自身情况是否需要拆分
//                                String split1 = split[0];
//                                String split2 = split[1];
//                                System.out.println(split);
                            }
                        });
                    }
                });
            }

        });



        //设置WebViewClient类
        mWebview.setWebViewClient(new WebViewClient() {
            //设置加载前的函数
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                System.out.println("开始加载了");
                beginLoading.setText("开始加载了");

            }

            //设置结束加载函数
            @Override
            public void onPageFinished(WebView view, String url) {
                endLoading.setText("结束加载了");

            }
        });
        //设置WebChromeClient类
        mWebview.setWebChromeClient(new WebChromeClient() {
            //获取网站标题
            @Override
            public void onReceivedTitle(WebView view, String title) {
                System.out.println("标题在这里");
                mtitle.setText(title);
            }

            //获取加载进度
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                if (newProgress < 100) {
                    String progress = newProgress + "%";
                    loading.setText(progress);
                } else if (newProgress == 100) {
                    String progress = newProgress + "%";
                    loading.setText(progress);
                }
            }

            @Override
            public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {

                System.out.println("接收到alert内容："+message);
//                Map maps = (Map)JSON.parse(message);
//                if (maps != null) {
//
//                    if (maps.get("name").equals("print")) {
//                        System.out.println("解析到的alert内容："+maps.get("body"));
//                    }else if (maps.get("name").equals("push")) {
//
//                    }else {
//
//                    }
//                }
                result.cancel();
                return true;
            }

            // 拦截输入框(原理同方式2)
            // 参数message:代表promt（）的内容（不是url）
            // 参数result:代表输入框的返回值
            @Override
            public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                // 根据协议的参数，判断是否是所需要的url(原理同方式2)
                // 一般根据scheme（协议格式） & authority（协议名）判断（前两个参数）
                //假定传入进来的 url = "js://webview?arg1=111&arg2=222"（同时也是约定好的需要拦截的）
                System.out.println("js调用了Android的方法");
                Uri uri = Uri.parse(message);
                System.out.println(uri);
                System.out.println(uri.getScheme());
                System.out.println(uri.getAuthority());
                // 如果url的协议 = 预先约定的 js 协议
                // 就解析往下解析参数
                if (uri.getScheme().equals("js")) {
                    // 如果 authority  = 预先约定协议里的 webview，即代表都符合约定的协议
                    // 所以拦截url,下面JS开始调用Android需要的方法
                    if (uri.getAuthority().equals("demo")) {
                        // 执行JS所需要调用的逻辑
                        System.out.println("js调用了Android的方法");
                        // 可以在协议上带有参数并传递到Android上
                        HashMap<String, String> params = new HashMap<>();
                        Set<String> collection = uri.getQueryParameterNames();

                        //参数result:代表消息框的返回值(输入值)
                        result.confirm("js调用了Android的方法成功啦");
                    }
                    return true;
                }
                return super.onJsPrompt(view, url, message, defaultValue, result);
            }
        });

//        new Thread(()->{
//            post();
//        });
//        post();
    }

    //点击返回上一页面而不是退出浏览器
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK && mWebview.canGoBack()) {
            mWebview.goBack();
            return true;
        }

        return super.onKeyDown(keyCode, event);
    }

    //销毁Webview
    @Override
    protected void onDestroy() {
        if (mWebview != null) {
            mWebview.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
            mWebview.clearHistory();
            ((ViewGroup) mWebview.getParent()).removeView(mWebview);
            mWebview.destroy();
            mWebview = null;
        }
        super.onDestroy();
    }

    /**
     * post请求
     */
    public void post() {
        OkHttpClient client = new OkHttpClient();
        FormBody.Builder formBody = new FormBody.Builder();//创建表单请求体
        formBody.add("version","v1.0.9");//传递键值对参数
        formBody.add("apptype","ios");
        Request request = new Request.Builder()
                .url("https://test.luyiwangluo.com/api/v15/car/saleCarHome")
                .post(formBody.build())//传递请求体
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
            }
            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if(response.isSuccessful()){//回调的方法执行在子线程。
                    Log.d("kwwl","获取数据成功了");
                    Log.d("kwwl","response.code()=="+response.code());
                    String data = response.body().string();
                    Log.d("kwwl","response.body().string()=="+data);
                    Map maps = (Map)JSON.parse(data);
                    System.out.println(maps);
                    maps.put("url", "/car/saleCarHome");
                    System.out.println(maps);
                    String json = JSON.toJSONString(maps);
                    runOnUiThread(new Runnable() {
                        public void run() {
                            mWebview.evaluateJavascript("javascript:callJS('" + json + "')", new ValueCallback<String>() {
                                @Override
                                public void onReceiveValue(String value) {

                                }
                            });
                        }
                    });

                }
            }
        });
    }

}
/*
  特别注意：JS代码调用一定要在 onPageFinished（） 回调之后才能调用，否则不会调用。
  onPageFinished()属于WebViewClient类的方法，主要在页面加载结束时调用
  文章：https://www.jianshu.com/p/345f4d8a5cfa
 */